﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AgileSaude.Entities;
using AgileSaude.Data;
using AgileSaude.Data.Repository;
using FBS.Framework;
using AgileSaude.Business.Validation;

namespace AgileSaude.Business.Process
{
    internal class ServicoProcess
    {
        internal Resultado Incluir(ServicoEntities pObj)
        {
            Resultado resultado = new Resultado();

            try
            {
                ServicoValidation userValid = new ServicoValidation(pObj);
                resultado = userValid.ValidarServico();

                if (resultado.Sucesso)
                {
                    servico user = new servico();
                    Util.CopyPropertyValues(pObj, user);

                    new servicoRepository().Add(user);
                }
            }
            catch (Exception ex)
            {
                String mensagem = ex.Message;
                new ResultadoProcess().GravarLog(ref resultado, mensagem, "AgileSaude", "", "Incluir", "ServicoProcess");
                resultado.Sucesso = false;
                throw ex;
            }

            return resultado;
        }

        internal Resultado Alterar(ServicoEntities pObj)
        {
            Resultado resultado = new Resultado();
            servicoRepository ServicoRepository = new servicoRepository();

            try
            {
                servico user = ServicoRepository.getservico(pObj.idServico);
                Util.CopyPropertyValues(pObj, user);

                ServicoRepository.Update();
                resultado.Sucesso = true;
            }
            catch (Exception ex)
            {
                Util.GravarLog(ex.Message, "AgileSaude");
                resultado.Sucesso = false;
                throw ex;
            }

            return resultado;
        }

        internal Resultado Deletar(ServicoEntities pObj)
        {
            Resultado resultado = new Resultado();
            servicoRepository ServicoRepository = new servicoRepository();

            try
            {
                servico obj = ServicoRepository.getservico(pObj.idServico);
                Util.CopyPropertyValues(pObj, obj);

                ServicoRepository.Delete(obj);
                resultado.Sucesso = true;
            }
            catch (Exception ex)
            {
                Util.GravarLog(ex.Message, "AgileSaude");
                resultado.Sucesso = false;
                throw ex;
            }

            return resultado;
        }

        internal ServicoEntities GetServico(int pIdServico)
        {
            servico oData = new servicoRepository().getservico(pIdServico);

            if (oData == null)
            {
                return new ServicoEntities();
            }
            else
            {
                return GetServico(oData);
            }

        }

        //internal ServicoEntities GetServico(string pNome)
        //{
        //    servico oData = new servicoRepository().getservico(pNome);

        //    if (oData == null)
        //    {
        //        return new ServicoEntities();
        //    }
        //    else
        //    {
        //        return GetServico(oData);
        //    }

        //}

        private static ServicoEntities GetServico(servico oData)
        {
            ServicoEntities userEntitie = new ServicoEntities();

            Util.CopyPropertyValues(oData, userEntitie);

            try
            {
                userEntitie.TipoServicoDescricao = new TipoServicoProcess().GetTipoServico(userEntitie.idTipoServico).Descricao;
            }
            catch { }

            return userEntitie;
        }

        internal List<ServicoEntities> Listar(ServicoEntities pFiltro, ref Resultado resultado)
        {
            List<ServicoEntities> lista = new List<ServicoEntities>();

            if (pFiltro == null)
            {
                pFiltro = new ServicoEntities();
            }

            try
            {
                var Servico = from u in new servicoRepository().GetAll()
                              where (string.IsNullOrEmpty(pFiltro.Descricao) || u.Descricao.ToUpper().Contains(pFiltro.Descricao.ToUpper()))
                              select u;

                foreach (servico user in Servico)
                {
                    lista.Add(GetServico(user));
                }

                resultado.Sucesso = true;
            }
            catch (Exception ex)
            {
                String mensagem = ex.Message;
                new ResultadoProcess().GravarLog(ref resultado, mensagem, "AgileSaude", "", "Listar", "ServicoProcess");
                resultado.Sucesso = false;
            }

            return lista;
        }

        internal int getIDConsulta(MedicoEntities oData)
        {
            int idConsulta = (from u in new servico_medicoRepository().GetAll()
                                 join s in new servicoRepository().GetAll() on u.idServico equals s.idServico
                                 where s.idTipoServico == 1 && u.idMedico == oData.idMedico
                                 orderby u.DataInicio descending
                                 select s.idServico).FirstOrDefault();

            if (idConsulta == null)
                return 0;
            else
                return idConsulta;
        }

    }
}
